import yaml
import random


def random_sum(n, total):
    if n == 1:
        return [total]
    num = random.randint(1, total - n)
    return [num] + random_sum(n - 1, total - num)


def generate_random_string(length, li=None, allow_special=None):
    # 生成指定长度和指定数据类型的随机字符串
    characters = ''

    if li is None:
        # 如果未指定，默认包含汉字、数字、字母、英文标点、中文标点
        li = ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']
    if allow_special is not None:
        # 若指定了允许的特殊符号，加入li
        li.append('allow_special')

    n = len(li)  # 由几种类型的字符组成
    num_li = random_sum(n, length)  # 获取每种字符的数量，使总和为指定长度
    if 'chinese' in li:
        while num_li[0] <= 1:  # 确保能取到至少一个中文
            num_li = random_sum(n, length)
    i = 0
    if 'chinese' in li:
        k_chi = num_li[i] // 2  # 一个汉字两个字符长度
        if num_li[i] % 2 == 1:
            num_li[i + 1] += 1
        char = ''
        # for j in range(0x4e00, 0x9fbf):
        for j in range(0x4e00, 0x9fa5):
            char += chr(j)
        # 输出结果
        chinese = ''.join(random.choice(char) for _ in range(k_chi))
        characters = characters + chinese
        i += 1
    if 'special_cn' in li:
        k_special_cn = num_li[i] // 2  # 一个汉字标点两个字符长度
        if num_li[i] % 2 == 1:
            num_li[i + 1] += 1
        special_cn = ''.join(random.choices('！￥……（）——’“：；，。《》？、·', k=k_special_cn))
        characters = characters + special_cn
        i += 1
    if 'nums' in li:
        k_num = num_li[i]
        nums = ''.join(random.choices('0123456789', k=k_num))
        characters = characters + nums
        i += 1
    if 'alpha' in li:
        k_alpha = num_li[i]
        alpha = ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=k_alpha))
        characters = characters + alpha
        i += 1
    if 'special_eng' in li:
        k_special_eng = num_li[i]
        special_eng = ''.join(random.choices('!@#$%^&*()-=+_<>?~`{}[];:,.|/\\\'\"', k=k_special_eng))
        characters = characters + special_eng
        i += 1
    if 'allow_special' in li:
        k_allow_special = num_li[i]
        allow_special = ''.join(random.choices(allow_special, k=k_allow_special))
        characters = characters + allow_special
        i += 1
    return characters


def generate_test_data():
    test_data = {'name': {'name': [], 'data': []}, 'alias': {'name': [], 'data': []},
                 'uuid': {'name': [], 'data': []}, 'work_email': {'name': [], 'data': []},
                 'phone': {'name': [], 'data': []}, 'fixed_phone': {'name': [], 'data': []},
                 'address': {'name': [], 'data': []}, 'title': {'name': [], 'data': []},
                 'extern_position': {'name': [], 'data': []}}
    # ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn', 'allow_special']

    # 姓名输入框
    test_data['name']['name'].append('长度为1-数字')
    test_data['name']['data'].append([generate_random_string(1, ['nums']), ''])

    test_data['name']['name'].append('长度为2-汉字')
    test_data['name']['data'].append([generate_random_string(2, ['chinese']), ''])

    test_data['name']['name'].append('长度为63-数字')
    test_data['name']['data'].append([generate_random_string(63, ['nums']), ''])

    test_data['name']['name'].append('长度为64-汉字、数字、字母、特殊字符')
    test_data['name']['data'].append(
        [generate_random_string(64, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), ''])

    test_data['name']['name'].append('长度为65-汉字、数字、字母、特殊字符')
    test_data['name']['data'].append(
        [generate_random_string(65, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), '请输入不多于64个字符'])

    test_data['name']['name'].append('长度为64-汉字、数字、字母、特殊字符-前后加空格')
    test_data['name']['data'].append(
        [' ' + generate_random_string(64, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']) + ' ', ''])

    test_data['name']['name'].append('长度为63-汉字、数字、字母、特殊字符-中间加一个空格')
    tmp = generate_random_string(63, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn'])
    test_data['name']['data'].append([tmp[:1] + ' ' + tmp[1:], ''])

    test_data['name']['name'].append('输入为空')
    test_data['name']['data'].append(['', '请填写姓名'])

    test_data['name']['name'].append('输入为多个空格')
    test_data['name']['data'].append(['   ', '请填写姓名'])
    # 重名可输入验证
    # test_data['name'].append([exist_name, ''])

    # 别名输入框
    test_data['alias']['name'].append('长度为1-字母')
    test_data['alias']['data'].append([generate_random_string(1, ['alpha']), ''])

    test_data['alias']['name'].append('长度为2-汉字')
    test_data['alias']['data'].append([generate_random_string(2, ['chinese']), ''])

    test_data['alias']['name'].append('长度为63-数字')
    test_data['alias']['data'].append([generate_random_string(63, ['nums']), ''])

    test_data['alias']['name'].append('长度为64-汉字、数字、字母、特殊字符')
    test_data['alias']['data'].append(
        [generate_random_string(64, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), ''])

    test_data['alias']['name'].append('长度为65-汉字、数字、字母、特殊字符')
    test_data['alias']['data'].append(
        [generate_random_string(65, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), '别名长度为1-64个字符'])

    test_data['alias']['name'].append('长度为64-汉字、数字、字母、特殊字符-前后加空格')
    test_data['alias']['data'].append(
        [' ' + generate_random_string(64, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']) + ' ', ''])

    test_data['alias']['name'].append('长度为63-汉字、数字、字母、特殊字符-中间加一个空格')
    tmp = generate_random_string(63, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn'])
    test_data['alias']['data'].append([tmp[:1] + ' ' + tmp[1:], ''])

    test_data['alias']['name'].append('输入为空')
    test_data['alias']['data'].append(['', ''])

    test_data['alias']['name'].append('输入为多个空格')
    test_data['alias']['data'].append(['   ', ''])

    # 账号输入框
    test_data['uuid']['name'].append('长度为1-字母')
    test_data['uuid']['data'].append([generate_random_string(1, ['alpha']), ''])

    test_data['uuid']['name'].append('长度为2-数字')
    test_data['uuid']['data'].append([generate_random_string(2, ['nums']), ''])

    test_data['uuid']['name'].append('长度为63-数字')
    test_data['uuid']['data'].append([generate_random_string(63, ['nums']), ''])

    test_data['uuid']['name'].append('长度为64-字母、数字、(.-_@)')
    test_data['uuid']['data'].append([generate_random_string(64, ['alpha', 'nums'], allow_special='.-_@'), ''])

    test_data['uuid']['name'].append('(.-_@)开头+长度为63-字母、数字')
    test_data['uuid']['data'].append(
        [''.join(random.choices('.-_@', k=1)) + generate_random_string(63, ['alpha', 'nums']), '（.-_@）不能放在开头'])

    test_data['uuid']['name'].append('长度为65-字母、数字、(.-_@)')
    test_data['uuid']['data'].append(
        [generate_random_string(65, ['alpha', 'nums'], allow_special='.-_@'), '帐号长度为 1-64 个字符'])

    test_data['uuid']['name'].append('输入为空')
    test_data['uuid']['data'].append(['', '请填写帐号'])

    test_data['uuid']['name'].append('输入为多个空格')
    test_data['uuid']['data'].append(['   ', '请填写帐号'])

    test_data['uuid']['name'].append('长度为64-字母、数字、特殊字符')
    test_data['uuid']['data'].append(
        [generate_random_string(64, ['alpha', 'nums', 'special_eng', 'special_cn']), '帐号只能由字母、数字及符号（.-_@）组成'])

    test_data['uuid']['name'].append('长度为64-字母、数字、(.-_@)、汉字')
    test_data['uuid']['data'].append(
        [generate_random_string(64, ['alpha', 'nums', 'chinese'], allow_special='.-_@'), '帐号只能由字母、数字及符号（.-_@）组成'])

    test_data['uuid']['name'].append('长度为64-字母、数字、(.-_@)-前后加空格')
    test_data['uuid']['data'].append(
        [' ' + generate_random_string(64, ['alpha', 'nums'], allow_special='.-_@') + ' ', ''])

    test_data['uuid']['name'].append('长度为63-字母、数字、(.-_@)-中间加一个空格')
    tmp = generate_random_string(63, ['alpha', 'nums'], allow_special='.-_@')
    test_data['uuid']['data'].append([tmp[:1] + ' ' + tmp[1:], '帐号只能由字母、数字及符号（.-_@）组成'])
    # 帐号不可重复验证
    # test_data['uuid']['data'].append([exist_id, '该帐号已被XX占有'])

    # 企业邮箱输入框'work_email'
    test_data['work_email']['name'].append('长度为1-字母')
    test_data['work_email']['data'].append([generate_random_string(1, ['alpha']), ''])

    test_data['work_email']['name'].append('长度为2-数字')
    test_data['work_email']['data'].append([generate_random_string(2, ['nums']), ''])

    test_data['work_email']['name'].append('长度为31-数字')
    test_data['work_email']['data'].append([generate_random_string(31, ['nums']), ''])

    test_data['work_email']['name'].append('长度为32-字母、数字、(.-_)')
    test_data['work_email']['data'].append([generate_random_string(32, ['alpha', 'nums'], allow_special='.-_'), ''])

    test_data['work_email']['name'].append('(.-_)开头+长度为31-字母、数字')
    test_data['work_email']['data'].append(
        [''.join(random.choices('.-_', k=1)) + generate_random_string(31, ['alpha', 'nums']), ''])

    test_data['work_email']['name'].append('长度为33-字母、数字、(.-_)')
    test_data['work_email']['data'].append(
        [generate_random_string(33, ['alpha', 'nums'], allow_special='.-_@'), '邮箱名长度为1-32个字符'])

    test_data['work_email']['name'].append('输入为空')
    test_data['work_email']['data'].append(['', '请填写企业邮箱'])

    test_data['work_email']['name'].append('输入为多个空格')
    test_data['work_email']['data'].append(['   ', '请填写企业邮箱'])

    test_data['work_email']['name'].append('长度为32-字母、数字、特殊字符')
    test_data['work_email']['data'].append(
        [generate_random_string(32, ['alpha', 'nums', 'special_eng', 'special_cn']), '请填写正确的邮箱地址'])

    test_data['work_email']['name'].append('长度为32-字母、数字、(.-_)、汉字')
    test_data['work_email']['data'].append(
        [generate_random_string(32, ['alpha', 'nums', 'chinese'], allow_special='.-_'), '请填写正确的邮箱地址'])

    test_data['work_email']['name'].append('长度为32-字母、数字、(.-_)-前后加空格')
    test_data['work_email']['data'].append(
        [' ' + generate_random_string(32, ['alpha', 'nums'], allow_special='.-_') + ' ', ''])

    test_data['work_email']['name'].append('长度为31-字母、数字、(.-_)-中间加一个空格')
    tmp = generate_random_string(31, ['alpha', 'nums'], allow_special='.-_')
    test_data['work_email']['data'].append([tmp[:1] + ' ' + tmp[1:], '请填写正确的邮箱地址'])

    # 企业邮箱不可重复验证
    # test_data['work_email']['data'].append([exist_id, '该企业邮箱已被XX占有'])

    # 手机号输入框'phone'
    test_data['phone']['name'].append('长度为11-数字')
    test_data['phone']['data'].append([generate_random_string(11, ['nums']), ''])

    test_data['phone']['name'].append('长度为10-数字')
    test_data['phone']['data'].append([generate_random_string(10, ['nums']), '请填写正确的手机号码'])

    test_data['phone']['name'].append('长度为12-数字')
    test_data['phone']['data'].append([generate_random_string(12, ['nums']), '请填写正确的手机号码'])

    test_data['phone']['name'].append('长度为11-数字+字母')
    test_data['phone']['data'].append([generate_random_string(10, ['nums', 'alpha']), '请填写正确的手机号码'])

    test_data['phone']['name'].append('长度为11-数字+汉字')
    test_data['phone']['data'].append([generate_random_string(10, ['nums', 'chinese']), '请填写正确的手机号码'])

    test_data['phone']['name'].append('长度为11-数字+特殊字符')
    test_data['phone']['data'].append([generate_random_string(10, ['nums', 'special_eng', 'special_cn']), '请填写正确的手机号码'])

    test_data['phone']['name'].append('长度为11-数字+空格')
    tmp = generate_random_string(10, ['nums'])
    test_data['phone']['data'].append([tmp[:1] + ' ' + tmp[1:], '请填写正确的手机号码'])

    test_data['phone']['name'].append('长度为11-数字-前后加空格')
    test_data['phone']['data'].append(
        [' ' + generate_random_string(11, ['nums']) + ' ', ''])

    # 座机输入框'fixed_phone'
    test_data['fixed_phone']['name'].append('长度为1-数字')
    test_data['fixed_phone']['data'].append([generate_random_string(1, ['nums']), ''])

    test_data['fixed_phone']['name'].append('长度为2-数字')
    test_data['fixed_phone']['data'].append([generate_random_string(2, ['nums']), ''])

    test_data['fixed_phone']['name'].append('长度为31-数字')
    test_data['fixed_phone']['data'].append([generate_random_string(31, ['nums']), ''])

    test_data['fixed_phone']['name'].append('长度为32-数字、(+_,)')
    test_data['fixed_phone']['data'].append([generate_random_string(32, ['nums'], allow_special='+_,'), ''])

    test_data['fixed_phone']['name'].append('(+_,)开头+长度为31-数字')
    test_data['fixed_phone']['data'].append(
        [''.join(random.choices('+_,', k=1)) + generate_random_string(31, ['nums']), ''])

    test_data['fixed_phone']['name'].append('长度为33-数字、(+_,)')
    test_data['fixed_phone']['data'].append(
        [generate_random_string(33, ['nums'], allow_special='+_,'), '最多32个字符'])

    test_data['fixed_phone']['name'].append('输入为空')
    test_data['fixed_phone']['data'].append(['', ''])

    test_data['fixed_phone']['name'].append('输入为多个空格')
    test_data['fixed_phone']['data'].append(['   ', ''])

    test_data['fixed_phone']['name'].append('长度为32-字母、数字')
    test_data['fixed_phone']['data'].append(
        [generate_random_string(32, ['alpha', 'nums']), '座机号码由1-32位数字、“-”、“+”或“,”号组成'])

    test_data['fixed_phone']['name'].append('长度为32-汉字、数字')
    test_data['fixed_phone']['data'].append(
        [generate_random_string(32, ['chinese', 'nums']), '座机号码由1-32位数字、“-”、“+”或“,”号组成'])

    test_data['fixed_phone']['name'].append('长度为32-数字、特殊字符')
    test_data['fixed_phone']['data'].append(
        [generate_random_string(32, ['nums', 'special_eng', 'special_cn']), '座机号码由1-32位数字、“-”、“+”或“,”号组成'])

    test_data['fixed_phone']['name'].append('长度为32-数字、(+_,)-前后加空格')
    test_data['fixed_phone']['data'].append(
        [' ' + generate_random_string(32, ['alpha', 'nums'], allow_special='+_,') + ' ', '座机号码由1-32位数字、“-”、“+”或“,”号组成'])

    test_data['fixed_phone']['name'].append('长度为31-数字、(+_,)-中间加一个空格')
    tmp = generate_random_string(31, ['alpha', 'nums'], allow_special='+_,')
    test_data['fixed_phone']['data'].append([tmp[:1] + ' ' + tmp[1:], '座机号码由1-32位数字、“-”、“+”或“,”号组成'])

    # 地址输入框'address'
    test_data['address']['name'].append('长度为1-字母')
    test_data['address']['data'].append([generate_random_string(1, ['alpha']), ''])

    test_data['address']['name'].append('长度为2-汉字')
    test_data['address']['data'].append([generate_random_string(2, ['chinese']), ''])

    test_data['address']['name'].append('长度为127-数字')
    test_data['address']['data'].append([generate_random_string(127, ['nums']), ''])

    test_data['address']['name'].append('长度为128-汉字、数字、字母、特殊字符')
    test_data['address']['data'].append(
        [generate_random_string(128, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), ''])

    test_data['address']['name'].append('长度为129-汉字、数字、字母、特殊字符')
    test_data['address']['data'].append(
        [generate_random_string(129, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), '地址不能超过128个字符'])

    test_data['address']['name'].append('长度为128-汉字、数字、字母、特殊字符-前后加空格')
    test_data['address']['data'].append(
        [' ' + generate_random_string(128, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']) + ' ', ''])

    test_data['address']['name'].append('长度为127-汉字、数字、字母、特殊字符-中间加一个空格')
    tmp = generate_random_string(127, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn'])
    test_data['address']['data'].append([tmp[:1] + ' ' + tmp[1:], ''])

    test_data['address']['name'].append('输入为空')
    test_data['address']['data'].append(['', ''])

    test_data['address']['name'].append('输入为多个空格')
    test_data['address']['data'].append(['   ', ''])

    # 邮箱输入框

    # 自定义职务输入框'title'
    test_data['title']['name'].append('长度为1-字母')
    test_data['title']['data'].append([generate_random_string(1, ['alpha']), ''])

    test_data['title']['name'].append('长度为2-汉字')
    test_data['title']['data'].append([generate_random_string(2, ['chinese']), ''])

    test_data['title']['name'].append('长度为127-数字')
    test_data['title']['data'].append([generate_random_string(127, ['nums']), ''])

    test_data['title']['name'].append('长度为128-汉字、数字、字母、特殊字符')
    test_data['title']['data'].append(
        [generate_random_string(128, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), ''])

    test_data['title']['name'].append('长度为129-汉字、数字、字母、特殊字符')
    test_data['title']['data'].append(
        [generate_random_string(129, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), '职务名称不能超过128个字符'])

    test_data['title']['name'].append('长度为128-汉字、数字、字母、特殊字符-前后加空格')
    test_data['title']['data'].append(
        [' ' + generate_random_string(128, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']) + ' ', ''])

    test_data['title']['name'].append('长度为127-汉字、数字、字母、特殊字符-中间加一个空格')
    tmp = generate_random_string(127, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn'])
    test_data['title']['data'].append([tmp[:1] + ' ' + tmp[1:], ''])

    test_data['title']['name'].append('输入为空')
    test_data['title']['data'].append(['', ''])

    test_data['title']['name'].append('输入为多个空格')
    test_data['title']['data'].append(['   ', ''])

    # 自定义职务'extern_position'
    test_data['extern_position']['name'].append('长度为1-字母')
    test_data['extern_position']['data'].append([generate_random_string(1, ['alpha']), ''])

    test_data['extern_position']['name'].append('长度为2-汉字')
    test_data['extern_position']['data'].append([generate_random_string(2, ['chinese']), ''])

    test_data['extern_position']['name'].append('长度为31-数字')
    test_data['extern_position']['data'].append([generate_random_string(31, ['nums']), ''])

    test_data['extern_position']['name'].append('长度为32-汉字、数字、字母、特殊字符')
    test_data['extern_position']['data'].append(
        [generate_random_string(32, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), ''])

    test_data['extern_position']['name'].append('长度为33-汉字、数字、字母、特殊字符')
    test_data['extern_position']['data'].append(
        [generate_random_string(33, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']), '最多不能超过32个字符'])

    test_data['extern_position']['name'].append('长度为32-汉字、数字、字母、特殊字符-前后加空格')
    test_data['extern_position']['data'].append(
        [' ' + generate_random_string(32, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn']) + ' ', ''])

    test_data['extern_position']['name'].append('长度为31-汉字、数字、字母、特殊字符-中间加一个空格')
    tmp = generate_random_string(31, ['chinese', 'nums', 'alpha', 'special_eng', 'special_cn'])
    test_data['extern_position']['data'].append([tmp[:1] + ' ' + tmp[1:], ''])

    test_data['extern_position']['name'].append('输入为空')
    test_data['extern_position']['data'].append(['', '对外信息中职务名称不能为空'])

    test_data['extern_position']['name'].append('输入为多个空格')
    test_data['extern_position']['data'].append(['   ', '对外信息中职务名称不能为空'])

    with open('../data/test_data.yaml', 'w', encoding="UTF-8") as f:
        yaml.dump(test_data, f, allow_unicode=True)


if __name__ == '__main__':
    generate_test_data()
